package com.ruoyi.goods.service;

import java.util.Date;
import java.util.List;
import com.ruoyi.enterwarehouse.domain.TGoodsBigitImport;
import com.ruoyi.enterwarehouse.domain.TGoodsEnterImport;
import com.ruoyi.enterwarehouse.domain.WEnterWarehouseInfo;
import com.ruoyi.exitwarehouse.domain.WExitWarehouseInfo;
import com.ruoyi.goods.domain.TGoodsInfo;
import com.ruoyi.goods.domain.TGoodsWeightSum;
import com.ruoyi.statistic.domain.WStatisticDimensionBigit;

/**
 * 货物信息Service接口
 * 
 * @author wzy
 * @date 2024-08-25 16:58:34
 */
public interface ITGoodsInfoService 
{
    /**
     * 查询货物信息
     * 
     * @param goodsId 货物信息主键
     * @return 货物信息
     */
    public TGoodsInfo selectTGoodsInfoByGoodsId(Long goodsId);

    /**
     * 查询货物信息列表
     * 
     * @param tGoodsInfo 货物信息
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoList(TGoodsInfo tGoodsInfo);

    /**
     * 新增货物信息
     * 
     * @param tGoodsInfo 货物信息
     * @return 结果
     */
    public int insertTGoodsInfo(TGoodsInfo tGoodsInfo);

    /**
     * 修改货物信息
     * 
     * @param tGoodsInfo 货物信息
     * @return 结果
     */
    public int updateTGoodsInfo(TGoodsInfo tGoodsInfo);

    /**
     * 批量删除货物信息
     * 
     * @param goodsIds 需要删除的货物信息主键集合
     * @return 结果
     */
    public int deleteTGoodsInfoByGoodsIds(Long[] goodsIds);

    /**
     * 删除货物信息信息
     * 
     * @param goodsId 货物信息主键
     * @return 结果
     */
    public int deleteTGoodsInfoByGoodsId(Long goodsId);

    /**
     * 批量更新货物运单编号
     *
     * @param goodsIds 需要更新的数据主键集合
     * @param waybillNumber 运单编号
     * @return 结果
     */
    public int updateTGoodsWayBillNumber(Long[] goodsIds, String waybillNumber);

    /**
     * 批量更新货物运单编号
     *
     * @param field 需要更新的字段约定
     * @param goodsIds 需要更新的数据主键集合
     * @param number 运单编号
     * @return 结果
     */
    public int updateTGoodsInfoByGoodsIds(Integer field, Long[] goodsIds, String number);

    /**
     * 批量更新货物入库相关字段
     *
     * @param goodsIds 需要更新的数据主键集合
     * @param enterWarehouseInfo 入库单信息
     * @return 结果
     */
    public int updateTGoodsInfoRelEnterWarehouseFieldsByGoodsIds(Long[] goodsIds, WEnterWarehouseInfo enterWarehouseInfo);

    /**
     * 批量更新货物出库相关字段
     *
     * @param goodsIds 需要更新的数据主键集合
     * @param exitWarehouseNumber 出库单编号
     * @param exitWarehouseInfo 出库单信息
     * @param inventoryStatus 库存状态
     * @return 结果
     */
    public int updateTGoodsInfoRelExitWarehouseFieldsByGoodsIds(Long[] goodsIds, String exitWarehouseNumber, WExitWarehouseInfo exitWarehouseInfo, String inventoryStatus);

    /**
     * 批量更新货物出库相关字段
     *
     * @param exitWarehouseIds 需要更新的数据主键集合
     * @param exitWarehouseInfo 出库单信息
     * @param inventoryStatus 库存状态
     * @return 结果
     */
    public int updateTGoodsInfoRelExitWarehouseFieldsByExitWarehouseIds(Long[] exitWarehouseIds, WExitWarehouseInfo exitWarehouseInfo, String inventoryStatus);

    /**
     * 查询货物信息列表
     *
     * @param field 需要更新的字段约定
     * @param number 货物信息
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoByNumber(Integer field, String number);

    /**
     * 查询货物信息列表
     *
     * @param goodsTransferId 货物信息
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoByTransferId(Long goodsTransferId);

    /**
     * 批量删除货物信息
     *
     * @param field 需要更新的字段约定
     * @param goodsIds 需要删除的货物信息主键集合
     * @return 结果
     */
    public int removeTGoodsInfoByGoodsIds(Integer field, Long[] goodsIds);

    /**
     * 批量清空货物信息中，出库相关字段
     *
     * @param goodsIds 需要清空的货物信息主键集合
     * @param exitWarehouseNumber 出库单号
     * @param operator 操作者
     * @return 结果
     */
    public int removeTGoodsExitWarehouseRelFieldByGoodsIds(Long[] goodsIds, String exitWarehouseNumber, String operator);

    /**
     * 计算货物总重量
     *
     * @param waybillNumber 货物信息主键
     * @return 结果
     */
    public double calculateTotalWeightByWayBillNumber(String waybillNumber);

    /**
     * 批量修改货物信息
     *
     * @param goodsInfos 货物信息
     * @return 结果
     */
    public int batchUpdateTGoodsTransferRelFields(List<TGoodsInfo> goodsInfos);

    /**
     * 批量物理删除货物信息
     *
     * @param goodsIds 需要删除的货物信息主键集合
     * @param enterWarehouseNumber 入库单号
     * @return 结果
     */
    public int deleteTGoodsInfoExtByGoodsIds(Long[] goodsIds, String enterWarehouseNumber);


    /**
     * 批量物理删除货物信息
     *
     * @param field 字段约定：入库Id，0，出库Id，1，货转Id，2
     * @param Ids 入库主键集合，出库主键集合，货转主键集合，
     * @return 结果
     */
    public int deleteTGoodsInfoByEnterWarehouseIds(Integer field, Long[] Ids);

    /**
     * 物理删除货物信息
     *
     * @param field 字段约定：入库单号，0，出库单号，1，货转单号，2
     * @param number 入库单号，出库单号，货转单号
     * @return 结果
     */
    public int deleteTGoodsInfoByNumberExt(Integer field, String number);

    /**
     * 批量更新货物状态
     *
     * @param field 需要更新的字段约定，0，入库，1，出库
     * @param warehouseNumber 入库或出库编号
     * @param status 在库状态
     * @return 结果
     */
    public int updateTGoodsInventoryStatusByWarehouseNumber(Integer field, String warehouseNumber, String status);

    /**
     * 批量更新货物状态
     *
     * @param enterWarehouseNumber 入库单号
     * @param inventoryStatus 在库状态
     * @param confirmPerson 入库确认人
     * @param confirmTime 入库确认时间
     * @return 结果
     */
    public int updateTGoodsConfirmRelFieldByEnterWarehouseNumber(String enterWarehouseNumber, String inventoryStatus, String confirmPerson, Date confirmTime);


    /**
     * 批量更新货物状态
     *
     * @param enterWarehouseInfo 入库单号
     * @param inventoryStatus 在库状态
     * @return 结果
     */
    public int updateTGoodsConfirmRelFieldsByEnterWarehouseNumber(WEnterWarehouseInfo enterWarehouseInfo, String inventoryStatus);

    /**
     * 批量更新货物状态
     *
     * @param exitWarehouseInfo 出库编号
     * @param inventoryStatus 在库状态
     * @return 结果
     */
    public int updateTGoodsConfirmRelFieldsByExitWarehouseNumber(WExitWarehouseInfo exitWarehouseInfo, String inventoryStatus);

    /**
     * 批量更新货物状态
     *
     *
     * @param goodsIds 需要更新的货物信息主键集合
     * @param status 在库状态
     * @return 结果
     */
    public int updateTGoodsInventoryStatusByGoodsIds(List<Long> goodsIds, String status);

    /**
     * 批量更新货物状态
     *
     *
     * @param goodsTransferIds 货转单号
     * @param status 在库状态
     * @return 结果
     */
    public int updateTGoodsInventoryStatusByTransferIds(Long[] goodsTransferIds, String status);

    /**
     * 查询货物信息列表，履历
     *
     * @param tGoodsInfo 货物信息
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoTraceList(TGoodsInfo tGoodsInfo);

    /**
     * 导入货物数据
     *
     * @param goodsList 用户数据列表
     * @param enterWarehouseNumber 是否更新支持，如果已存在，则进行更新数据
     * @param operName 操作用户
     * @return 结果
     */
    public String importGoods(List<TGoodsEnterImport> goodsList, String enterWarehouseNumber, String operName);

    /**
     * 导入货物数据
     *
     * @param goodsList 用户数据列表
     * @param enterWarehouseNumber 是否更新支持，如果已存在，则进行更新数据
     * @param operName 操作用户
     * @return 结果
     */
    public String importGoodsBigit(List<TGoodsBigitImport> goodsList, String enterWarehouseNumber, String goodsType, Date enterWarehouseTime, String goodsRightCustomer, String operName);

    /**
     * 获取货物重量合计
     *
     * @param inventoryStatus 库存状态列表
     * @return 结果
     */
    public List<TGoodsWeightSum> getWeightSumByInventoryStatus(List<String> inventoryStatus);

    /**
     * 获取货物重量合计
     *
     * @param tGoodsInfo 货物信息参数
     * @return 结果
     */
    public List<TGoodsWeightSum> getWeightSumByGoodsInfo(TGoodsInfo tGoodsInfo);

    /**
     * 获取统计维度
     *
     * @param begin 日期
     * @param end 日期
     * @return 结果
     */
    public List<WStatisticDimensionBigit> selectStatisticDimensionByEnterWarehouseDate(Date begin, Date end);

    /**
     * 查询货物信息列表，用于入库量统计
     *
     * @param tGoodsInfo 货物信息
     * @param begin 日期
     * @param end 日期
     * @return 货物信息
     */
    public List<TGoodsInfo> selectTGoodsInfoListUsedByEnterStatistic(TGoodsInfo tGoodsInfo, Date begin, Date end);

    /**
     * 查询统计字段值，日出库量统计
     *
     * @param begin 日期
     * @param end 日期
     * @return 结果
     */
    public List<WStatisticDimensionBigit> selectStatisticDimensionByExitWarehouseDate(Date begin, Date end);

    /**
     * 查询货物信息列表，用于日出库/入库量统计
     *
     * @param tGoodsInfo 货物信息
     * @param begin 日期
     * @param end 日期
     * @return 货物信息
     */
    public List<TGoodsInfo> selectTGoodsInfoListUsedByExitStatistic(TGoodsInfo tGoodsInfo, Date begin, Date end);

    /**
     * 查询货物信息列表，用于月出库/入库量统计
     *
     * @param field 条件字段约定，0，合约号，
     * @param tGoodsInfo 货物信息
     * @param begin 日期
     * @param end 日期
     * @return 货物信息
     */
    public List<TGoodsInfo> selectTGoodsInfoListUsedByMonthStatistic(Integer field, TGoodsInfo tGoodsInfo, Date begin, Date end);

    /**
     * 查询货物信息列表，日出库量统计
     *
     * @param dayExitStatisticId 日出库统计ID
     * @param tGoodsInfo 货物信息参数
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoByDayExitStatisticId(Long dayExitStatisticId, TGoodsInfo tGoodsInfo);

    /**
     * 查询货物信息列表，月出库量统计
     *
     * @param monthExitStatisticId 月出库统计ID
     * @param tGoodsInfo 货物信息参数
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoByMonthExitStatisticId(Long monthExitStatisticId, TGoodsInfo tGoodsInfo);

    /**
     * 理货修改库位信息
     *
     * @param goodsIds 货物主键ID
     * @param tGoodsInfo 货物信息参数
     * @return 货物信息集合
     */
    public int tallyTGoodsInfoByGoodsIds(Long[] goodsIds, TGoodsInfo tGoodsInfo);

    /**
     * 查询货物信息列表
     *
     * @param tGoodsInfo 货物信息
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoListForMiniProgram(TGoodsInfo tGoodsInfo);

    /**
     * 查询货物信息列表，移动端模糊查询，捆包号
     *
     * @param tGoodsInfo 货物信息
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoListExt(TGoodsInfo tGoodsInfo);

    /**
     * 拆分货物
     *
     * @param numberOfSplit 拆分件数
     * @param splitWeightExt 拆分重量
     * @param tGoodsInfo 货物信息
     * @return 结果
     */
    public int splitGoodsInfoByNumberOfSplit(Integer numberOfSplit, Double splitWeightExt, TGoodsInfo tGoodsInfo);

    /**
     * 查询货物信息列表，盘库货物列表
     *
     * @param checkGoodsId 盘库ID
     * @param tGoodsInfo 货物信息参数
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoByCheckGoodsId(Long checkGoodsId, TGoodsInfo tGoodsInfo);

    /**
     * 查询货物信息
     *
     * @param bundleNumber 货物信息主键
     * @return 货物信息
     */
    public TGoodsInfo selectTGoodsInfoByBundleNumber(String bundleNumber);

    /**
     * 批量修改货物信息
     *
     * @param goodsInfos 货物信息
     * @return 结果
     */
    public int batchUpdateTGoodsWarehouseFeeRelFields(List<TGoodsInfo> goodsInfos);

    /**
     * 查询货物计重模式
     *
     * @param contractNumber 合同号
     * @return 货物信息
     */
    public String selectTGoodsWeightModeByContractNumber(String contractNumber);

    /**
     * 查询货物信息列表
     *
     * @param tGoodsInfo 货物信息
     * @return 货物信息集合
     */
    public List<TGoodsInfo> selectTGoodsInfoListByMultipleBuddleNumber(TGoodsInfo tGoodsInfo);

    /**
     * 校验捆包号是否唯一
     *
     * @param tGoodsInfo 货物信息
     * @return 结果
     */
    public String checkBundleNumberUnique(TGoodsInfo tGoodsInfo);

    /**
     * 计算货物总重量
     *
     * @param field 字段约定，0，运单编号，1，入库编号，2，出库编号，
     * @param number 货物信息主键
     * @return 结果
     */
    public double calculateGoodsTotalWeightByNumber(Integer field, String number);

    /**
     * 查询货物信息，数量
     *
     * @param enterWarehouseNumber 入库单号
     * @return 货物信息
     */
    public int selectTGoodsInfoCountByEnterWarehouseNumber(String enterWarehouseNumber);

}
